/**
 * Copyright (c) [2025] [何屹林]
 *
 * 保留所有权利。
 *
 * 文件名称：LR_1_DFAShow.cpp
 * 模块功能说明：
 * 该模块实现逻辑处理类中关于LR1的DFA图相关内容展示接口
 *
 * 华南师范大学-计算机学院-网络工程-1班
 * 作者：何屹林-20222132023
 * 完成日期：2025年7月24日
 */
#include "logic.h"

void Logic::lr1_DfaShow(const QString& title)
{
    Item first_item(start_sign,*grammars[start_sign].begin(),QSet<QString>({"$"}),0);       //初规则
    State first_state;                                                                      //初状态
    first_state.st.insert(first_item);
    first_state=State::closure(first_state,grammars,nonFinalizers,first_set);

    LR1 lr1;                                                                                //lr1类
    lr1.state_hash[first_state] = 0;
    lr1.size = 1;

    lr1.buildLR1(first_state, grammars, nonFinalizers, first_set, follow_set,Grams);

    QStringList header,colHeader;                                                          //表头，行头
    for(auto i:lr1.change_hash.keys())
        for(auto j:lr1.change_hash[i].keys())
            if(!header.contains(j)) header.append(j);

    for(int i=0;i<lr1.state_hash.size();i++) colHeader.append(QString::number(i));

    int row=colHeader.size();
    int col=header.size();
    QVector<QVector<QString>> contentTable(row,QVector<QString>(col));                  //内容表

    // 正确填充表格内容
    for (int i = 0; i < lr1.state_hash.size(); i++) {
        for (int j = 0; j < header.size(); j++) {
            QString symbol = header[j];
            if (lr1.change_hash.contains(i) && lr1.change_hash[i].contains(symbol)) {
                int target = lr1.change_hash[i][symbol];
                contentTable[i][j]=QString::number(target);
            }
        }
    }

    formShow(title,header,colHeader,contentTable);
    return;
}
